<?php
/**
 * スタッフコントローラ
 */
require_once 'Request/Request.php';
require_once 'Session.php';
require_once 'b64.php';
require_once APPLICATION_PATH . '/models/Staff/xml/StaffXmlController.php';
require_once APPLICATION_PATH . '/models/controller.php';
require_once APPLICATION_PATH . '/models/Names/Names.php';
require_once dirname(__FILE__) . '/SiteController.php';

/**
 * スタッフ関連画面
 */
class StaffController extends Zend_Controller_Action
{
	/** 名称：セッションキー */
	const NAME_SESSION_KEY = 'STAFF-AUTH';
	/** 名称：キー：ログインＩＤ */
	const NAME_KEY_LOGINID = 'LOGINID';
	/** 名称：チェックボックス：パスワード変更開始 */
	const NAME_CHECKBOX_PASSWORD_CHANGE = "CBOX_PCHANGE";
	/** 名称：ボタン：ログイン */
	const NAME_BUTTON_LOGIN = "BUTTON_LOGIN";
	/** 名称：テキストボックス：新パスワード */
	const NAME_TEXT_BOX_NEWPASSWORD = 'TBOX_NEWPASSWD';
	/** 名称：テキストボックス：新パスワード（再入力） */
	const NAME_TEXT_BOX_NEWPASSWORD_REWRITE = 'TBOX_NEWPASSWD_REWRITE';
	/** 名称：ユニークID */
	const NAME_UID = 'uid';
	/** URL：認証アクション */
	const URL_AUTH = '/Staff/auth';
	/** URL:パスワード変更アクション */
	const URL_CHANGEPASSWORD = '/Staff/changepassword';
	/** @var HTTPリクエストオブジェクト */
	protected $_objHttpRequest;
	/** @var セッションオブジェクト */
	protected $_objSession;

	/**
	 * 共通イニシャライズ
	 */
    public function init()
    {
        /* Initialize action controller here */
    	$this->_objHttpRequest = new Lib_Request();
    }

    public function indexAction()
    {
        // action body
    }

    /**
     * ログアウトアクション
     * 画面無し
     */
    public function logoutAction()
    {
    	self::sessionClear();
    	$this->_redirect('/Calendar/vt');
    }

    /**
     * ログインセッションをクリアする
     */
    public static function sessionClear()
    {
    	$sessionKey = self::NAME_SESSION_KEY;
    	$objSession = new Lib_Session($sessionKey);
    	$objSession->clear();
    }

    /**
     * ログイン画面
     * /application/views/scripts/staff/login.tpl
     */
    public function loginAction()
    {
    	$this->view->teamName = '';
		$uid = $this->_objHttpRequest->get(self::NAME_UID);
		$registPapers = SiteController::getBinder(FALSE)->get_pages();
		if (isset($registPapers[$uid])) {
			$this->view->teamName = $registPapers[$uid]->get_teamname();
		}
		$this->view->uid = $uid;
		$this->view->selfUrl =  $_SERVER['REQUEST_URI'];

		$this->view->errMessage = $this->_getLoginErrorMessage();
    }

    /**
     * 認証アクション
     * ログインに成功するとリダイレクトスキップされる画面
     */
	public function authAction()
	{
		$bStaff = FALSE;
		/*** 入力ユーザ名とパスワードとユニークIDを取得する */
		$teamName = $this->_objHttpRequest->get(Models_StaffController::KEY_NAME);
		$passWord = $this->_objHttpRequest->get(Models_StaffController::KEY_PASSWORD);
		$uid = $this->_objHttpRequest->get(self::NAME_UID);

		if (!$this->_auth($teamName, $passWord,$uid)) {
			$this->_redirect('/Staff/login?uid=' . $uid . '&' . self::KEY_ERR . '=' . $this->_authErrorId);
			exit();
		}

		self::saveSession($uid);
		Models_Controller::setFolder($uid);
		$this->_redirect('/Staff/menu');
		exit();
	}
	const KEY_ERR = 'e';

	/**
	 * メニュー画面
	 */
	public function menuAction()
	{
		$this->view->menuList = self::createMenuList();

		$registPapers = SiteController::getBinder(FALSE)->get_pages();
		$this->view->teamName = $registPapers[self::getLoginId()]->get_teamname();
	}

	public static  function createMenuList()
	{
		$aryResult = array();
		$menuList = explode("\n", 		STAFF_CONTROLLE_MENU_LIST);
		foreach ($menuList as $menu) {
			$divide = explode(',', $menu);
			if (count($divide) != 2) {
				continue;
			}
			$aryResult[] = array('disp'=>$divide[0], 'url'=>$divide[1]);
		}
		return $aryResult;
	}

	/**
	 * 認証
	 * @param unknown $name
	 * @param unknown $password
	 * @param $uid
	 * @return boolean
	 */
	protected function _auth($name, $password, $uid)
	{
		$registPapers = SiteController::getBinder(FALSE)->get_pages();
		/*** 登録バインダーに該当UIDの登録が綴じられていなければ非認証 */
		if (!isset($registPapers[$uid])) {
			$this->_authErrorId = self::ERR_ID_AUTH_NOT_FOUND_UID;
			return FALSE;
		}
		/*** 削除フラグが真の場合は非認証 */
		if ($registPapers[$uid]->get_deleteflg()) {
			$this->_authErrorId = self::ERR_ID_AUTH_DELETED;
			return FALSE;
		}
		/*** チーム名が間違っている場合は非認証 */
		$ret = $registPapers[$uid]->isYou('_teamName', $name, object::SELECT_AGREE);
		if (!$registPapers[$uid]->isYou('_teamName', $name, object::SELECT_AGREE)) {
			$this->_authErrorId = self::ERR_ID_AUTH_WRONG_TEAM_NAME;
			return FALSE;
		}
		/*** パスワードが間違っている場合は非認証 */
		if (!$registPapers[$uid]->isYou('_loginPassword', $password, object::SELECT_AGREE)) {
			$this->_authErrorId = self::ERR_ID_AUTH_WRONG_PASSWORD;
			return FALSE;
		}

		return TRUE;
	}

	protected $_authErrorId;
	const ERR_ID_AUTH_NOT_FOUND_UID = 'SCEI001';
	const ERR_ID_AUTH_DELETED ='SCEI002';
	const ERR_ID_AUTH_WRONG_TEAM_NAME = 'SCEI003';
	const ERR_ID_AUTH_WRONG_PASSWORD = 'SCEI004';
	protected function _getLoginErrorMessage()
	{
		if (!isset($_REQUEST[self::KEY_ERR])) {
			return '';
		}
		$aryMessages = array(
			self::ERR_ID_AUTH_DELETED=>'チームはご利用を終了しています。',
			self::ERR_ID_AUTH_NOT_FOUND_UID=>'チームは未登録です。',
			self::ERR_ID_AUTH_WRONG_PASSWORD=>'パスワードが間違っています。',
			self::ERR_ID_AUTH_WRONG_TEAM_NAME=>'チーム名が間違っています。'
		);
		if (!isset($aryMessages[$_REQUEST[self::KEY_ERR]])) {
			return '';
		}
		return $aryMessages[$_REQUEST[self::KEY_ERR]];
	}
	/**
	 * パスワード変更結果画面
	 * パスワード変更アクション
	 */
	public function changepasswordAction()
	{
		$this->view->bChanged = FALSE;
		$userName = $this->_objHttpRequest->get(Models_StaffController::KEY_NAME);
		$passWord = $this->_objHttpRequest->get(Models_StaffController::KEY_PASSWORD);
		$newPassword = $this->_objHttpRequest->get(self::NAME_TEXT_BOX_NEWPASSWORD);

		$objModelsStaff = new Models_Staff_XMLController();
		// 認証判定
		if ($objModelsStaff->isMember($userName, $passWord)) {
			self::saveSession($userName);
			$result = $objModelsStaff->changePassword($userName, $newPassword);
			if (!$result) {
				$this->view->Message = "混雑のため、パスワードを変更できませんでした。";
			} else {
				$this->view->Message = "パスワードを変更しました。";
				$this->view->bChanged = TRUE;
			}
		} else {
			$this->view->Message = "ログインパスワードが間違っています。";
		}
	}

	/**
	 * ログインＩＤを返す。
	 * ログインしていない場合、空文字を返す。
	 * @return string
	 */
	public static function getLoginId()
	{
		$objSession = new Lib_Session(self::NAME_SESSION_KEY);
		$loginId = $objSession->getValue(self::NAME_KEY_LOGINID);
		return $loginId;
	}

	/**
	 * ログイン成功ＩＤをセッションに保存する
	 * @param unknown $userName
	 */
	public static function saveSession($userName)
	{
		$sessionKey = self::NAME_SESSION_KEY;
		$objSession = new Lib_Session($sessionKey);
		$objSession->setValue(self::NAME_KEY_LOGINID, $userName);
	}

	/**
	 * ログインしているかどうかを返す
	 * @return boolean
	 */
	public static function isLogined()
	{
		$loginId = self::getLoginId();
		if ($loginId != '') {
			return TRUE;
		}
		return FALSE;
	}
}

/***
 * メニューリスト
 */
define("STAFF_CONTROLLE_MENU_LIST",
<<<EOD
イベント登録・編集,/Calendar/vt
会場地図登録,/Place/add?done=/Staff/menu
会場編集,/Place/permute?REFERER=/Staff/menu
チーム登録内容変更,/Changeregist/edit
サイト利用終了,/Leaveoff/sendconfirmmail
EOD
);
